package com.sky.service.impl;

import com.sky.dto.GoodsSalesDTO;
import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import com.sky.mapper.UserMapper;
import com.sky.service.ReportService;
import com.sky.vo.OrderReportVO;
import com.sky.vo.SalesTop10ReportVO;
import com.sky.vo.TurnoverReportVO;
import com.sky.vo.UserReportVO;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class ReportServiceImpl  implements ReportService {
    @Autowired
    OrderMapper orderMapper;
    @Autowired
    UserMapper userMapper;
    public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end)
    {
        List<LocalDate> dateList=new ArrayList<>();
        dateList.add(begin);
        while (!begin.equals(end))
        {
            begin=begin.plusDays(1);//日期加1
            dateList.add(begin);
        }

        List<Double> turnoverList=new ArrayList<>();
        for(LocalDate date:dateList)
        {
            LocalDateTime beginTime=LocalDateTime.of(date, LocalTime.MIN);//将LOcaldate类型转换为LocaldateTime
            // LocalTime.MIN时间为0：00 LocalTime.MAX时间为23：59：999999
            LocalDateTime endTime=LocalDateTime.of(date,LocalTime.MAX);
            Map map=new HashMap();
            map.put("begin",beginTime);
            map.put("end",endTime);
            map.put("status", Orders.CANCELLED);
            Double turnover=orderMapper.sumByMap(map);
            turnover=turnover==null ? 0.0 :turnover;//如果营业额为空，定值为0.0
            turnoverList.add(turnover);
        }
        TurnoverReportVO turnoverReportVO=TurnoverReportVO.builder().dateList(StringUtil.join(",", dateList))
                .turnoverList(StringUtils.join(turnoverList, ","))//遍历字符串每个数据进行连接，用“,”来分隔
                .build();
        return  turnoverReportVO;

    }
    public UserReportVO getUserStatistics(LocalDate begin, LocalDate end)
    {
        List<LocalDate> dateList=new ArrayList<>();
     dateList.add(begin);
     while (!begin.equals(end))
     {
         begin=begin.plusDays(1);
         dateList.add(begin);
     }

     List<Integer> newUserList=new ArrayList<>();
     List<Integer> totalUserList=new ArrayList<>();

     for(LocalDate date:dateList)
     {
         LocalDateTime beginTime=LocalDateTime.of(date,LocalTime.MIN);
         LocalDateTime  endTime=LocalDateTime.of(date,LocalTime.MAX);
         Map map=new HashMap<>();
         map.put("end",endTime);
         //总用户数量
         Integer totalUser=userMapper.countByMap(map);
         map.put("begin",beginTime);
         //新增用户数量
         Integer newUser=userMapper.countByMap(map);
         totalUserList.add(totalUser);
         newUserList.add(newUser);

     }
     return UserReportVO.
             builder()
             .dateList(StringUtils.join(dateList, ","))
             .totalUserList(StringUtils.join(totalUserList, ","))
             .newUserList(StringUtils.join(newUserList, ","))
             .build();
    }
   public OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end)
   {
        List<LocalDate> dateList=new ArrayList<>();
        dateList.add(begin);
        while (!begin.equals(end))
       {
           begin=begin.plusDays(1);
           dateList.add(begin);
       }
        List<Integer> orderCountList =new ArrayList<>();//存放每天的订单总量
        List<Integer> validOrderCountList=new ArrayList<>();//存放每天的有效订单量

       for(LocalDate date:dateList)
       {
           //查询每天的订单总量
           LocalDateTime beginTime=LocalDateTime.of(date,LocalTime.MIN);
           LocalDateTime endTime=LocalDateTime.of(date,LocalTime.MAX);
           Integer orderCount=getOrderCount(beginTime,endTime,null);
//查询每天的有效订单数
Integer validOrderCount=getOrderCount(beginTime,endTime,Orders.COMPLETED);
orderCountList.add(orderCount);
validOrderCountList.add(validOrderCount);

       }
       //计算时间区间内的订单总数
Integer totalOrderCount=orderCountList.stream().reduce(Integer::sum).get();//求和
//计算时间区间内的有效订单总数
       Integer validOrderCount=validOrderCountList.stream().reduce(Integer::sum).get();
       //计算订单完成率
       Double orderCompletionRate=0.0;//排除分母为0
       if(totalOrderCount!=0)
       {
           orderCompletionRate=validOrderCount.doubleValue()/totalOrderCount;
       }
//封装vo
       OrderReportVO orderReportVO=OrderReportVO.builder()
               .dateList(StringUtil.join(",", dateList))
               .orderCountList(StringUtils.join(orderCountList, ","))
               .validOrderCountList(StringUtils.join(validOrderCountList,","))
               .totalOrderCount(totalOrderCount)
               .validOrderCount(validOrderCount)
               .orderCompletionRate(orderCompletionRate)
               .build();
       return  orderReportVO;

   }
    private Integer getOrderCount(LocalDateTime begin,LocalDateTime end,Integer status)
    {
        Map map=new HashMap<>();
        map.put("begin",begin);
        map.put("end",end);
        map.put("status",status);
        return  orderMapper.countByMap(map);
    }
public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end)
{
    LocalDateTime beginTime=LocalDateTime.of(begin,LocalTime.MIN);
    LocalDateTime endTime=LocalDateTime.of(end,LocalTime.MAX);
    List<GoodsSalesDTO> salesTop10=orderMapper.getSalesTop10(beginTime,endTime);
    List<String> names=salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList());
    String nameList=StringUtils.join(names,",");
    List<Integer> numbers=salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList());

    String numberList= StringUtils.join(numbers,",");
    SalesTop10ReportVO salesTop10ReportVO=SalesTop10ReportVO.builder()
            .nameList(nameList)
            .numberList(numberList)
            .build();
    return (salesTop10ReportVO);

}
}
